package cn.wen.javax.crypto;

import cn.wen.java.nio.Charset;
import cn.wen.java.nio.Encoder;

/**
 * Title：加密/解密相关操作（抽象类）
 * <p>
 * Description：提供加密/解密处理。
 * <p>
 * Copyright：Copyright (c) 2010-2012
 * 
 * @author <a href="mailto:ct_wen@qq.com">ctwen</a>, 温承瑭
 * @version Revision：1.0 Date：2012/7/13 Description：初完成。
 *          <p>
 */
public abstract class AbstractCipher implements ICipher {

    /**
     * 转换的名称
     */
    protected String transformation;

    /**
     * 密钥算法的标准名称
     */
    protected String algorithm;

    /**
     * 缺省的密钥；
     * 注：（DES, DESede）长度必需为8的整数倍。
     * DES：8 length; DESede：24 length;
     */
    protected byte[] key;

    @Override
    public String decrypt(String src) throws Exception {
	return decrypt(src, key);
    }

    @Override
    public String decrypt(String src, String key) throws Exception {
	return decrypt(src, key.getBytes(Charset.UTF_8));
    }

    @Override
    public String decrypt(String src, byte[] key) throws Exception {
	return new String(decrypt(Encoder.hex2Byte(src), key));
    }

    @Override
    public byte[] decrypt(byte[] src) throws Exception {
	return decrypt(src, key);
    }

    @Override
    public abstract byte[] decrypt(byte[] src, byte[] key) throws Exception;

    @Override
    public String encrypt(String src) throws Exception {
	return encrypt(src, key);
    }

    @Override
    public String encrypt(String src, String key) throws Exception {
	return encrypt(src, key.getBytes(Charset.UTF_8));
    }

    @Override
    public String encrypt(String src, byte[] key) throws Exception {
	return Encoder.toHexString(encrypt(src.getBytes(Charset.UTF_8), key));
    }

    @Override
    public byte[] encrypt(byte[] src) throws Exception {
	return encrypt(src, key);
    }

    @Override
    public abstract byte[] encrypt(byte[] src, byte[] key) throws Exception;

    @Override
    public String getTransformation() {
	return transformation;
    }

    @Override
    public void setTransformation(String transformation) {
	this.transformation = transformation;
    }

    @Override
    public String getAlgorithm() {
	return algorithm;
    }

    @Override
    public void setAlgorithm(String algorithm) {
	this.algorithm = algorithm;
    }

    @Override
    public byte[] getKey() {
	return key;
    }

    @Override
    public void setKey(byte[] key) {
	this.key = key;
    }

}
